package com.pai4j.pgc.converter;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.persistence.AttributeConverter;
import jakarta.persistence.Converter;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.util.ArrayList;
import java.util.List;

/**
 * List<String> 与 JSON 字符串的转换器
 * 用于将 List<String> 类型的字段以 JSON 格式存储到数据库
 *
 * @author: CYM-pai
 * @date: 2025/10/11
 */
@Slf4j
@Converter
public class StringListConverter implements AttributeConverter<List<String>, String> {

    private static final ObjectMapper objectMapper = new ObjectMapper();

    /**
     * 将 List<String> 转换为 JSON 字符串存储到数据库
     *
     * @param attribute List<String> 对象
     * @return JSON 字符串
     */
    @Override
    public String convertToDatabaseColumn(List<String> attribute) {
        if (attribute == null || attribute.isEmpty()) {
            return "[]";
        }
        try {
            return objectMapper.writeValueAsString(attribute);
        } catch (JsonProcessingException e) {
            log.error("List<String> 转换为 JSON 失败", e);
            return "[]";
        }
    }

    /**
     * 将数据库中的 JSON 字符串转换为 List<String>
     *
     * @param dbData 数据库中的 JSON 字符串
     * @return List<String> 对象
     */
    @Override
    public List<String> convertToEntityAttribute(String dbData) {
        if (StringUtils.isBlank(dbData) || "[]".equals(dbData)) {
            return new ArrayList<>();
        }
        try {
            return objectMapper.readValue(dbData, new TypeReference<List<String>>() {});
        } catch (JsonProcessingException e) {
            log.error("JSON 转换为 List<String> 失败: {}", dbData, e);
            return new ArrayList<>();
        }
    }
}

